package com.hspedu.customgeneric;

/**
 * @author LiuJinTao
 * @className CustomInterfaceGeneric
 * @date 2024/06/19 12:10
 * @description TODO
 */
public class CustomInterfaceGeneric {
    public static void main(String[] args) {

    }
}

// 没有指定类型，默认为 Object
class CC implements IUsb {
    @Override
    public Object get(Object o) {
        return null;
    }

    @Override
    public void hi(Object o) {

    }

    @Override
    public void run(Object r1, Object r2, Object u1, Object u2) {

    }
}

// 在实现接口时，直接指定泛型接口的类型
class BB implements IUsb<Integer, Float> {

    @Override
    public Float get(Integer integer) {
        return null;
    }

    @Override
    public void hi(Float aFloat) {

    }

    @Override
    public void run(Float r1, Float r2, Integer u1, Integer u2) {

    }
}

// 当我们在实现 IA 接口时，因为我们 IA 在继承 IUsb 接口时，指定 U 为 String R 为 Double
// 在实现 IUsb 接口的方法时，使用 String 替换 U，Double 替换 R
class AA implements IA {

    @Override
    public Double get(String s) {
        return null;
    }

    @Override
    public void hi(Double aDouble) {

    }

    @Override
    public void run(Double r1, Double r2, String u1, String u2) {

    }
}

// 在继承接口时指定泛型接口的类型
interface IA extends IUsb<String, Double> {

}

/**
 * 在泛型接口中，静态成员不能使用泛型
 * 泛型接口的类型，在继承接口或实现接口时确定
 * @param <U>
 * @param <R>
 */
interface IUsb<U, R> {
    int n = 10;
//    U name = "hsp";//接口中属性全是静态

    //普通方法中，可以使用接口泛型
    R get(U u);
    void hi(R r);
    void run(R r1, R r2, U u1, U u2);

    // 在JDK8中，可以在接口中使用默认方法
    default R method(U u) {
        return null;
    }
}

